guard against people deleting the row in question in the selection-changed
authorKristian Rietveld <kris@imendio.com>
Tue, 12 Feb 2008 15:58:25 +0000 (15:58 +0000)
committerKristian Rietveld <kristian@src.gnome.org>
Tue, 12 Feb 2008 15:58:25 +0000 (15:58 +0000)
2008-02-12  Kristian Rietveld  <kris@imendio.com>

* gtk/gtktreeview.c (gtk_tree_view_real_select_cursor_row),
(gtk_tree_view_real_toggle_cursor_row): guard against people
deleting the row in question in the selection-changed callback.
(#514621, Andreas Koehler).

svn path=/trunk/; revision=19530

ChangeLog
gtk/gtktreeview.c

index 520d1331d1758927eea70d437b38a3348e135663..8a1d03765d8aa450986c720153f49ab74bba52d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-02-12  Kristian Rietveld  <kris@imendio.com>
+
+       * gtk/gtktreeview.c (gtk_tree_view_real_select_cursor_row),
+       (gtk_tree_view_real_toggle_cursor_row): guard against people
+       deleting the row in question in the selection-changed callback.
+       (#514621, Andreas Koehler).
+
 2008-02-12  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/*.c: Unify the handling of various "Enter" keysyms
index 06a4a77b22730b1c393a59cbbf27145393761bd6..ce67dce9c77ad53d11d653986b15da05eac9f454 100644 (file)
@@ -10081,6 +10081,8 @@ static gboolean
 gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
                                      gboolean     start_editing)
 {
+  GtkRBTree *new_tree = NULL;
+  GtkRBNode *new_node = NULL;
   GtkRBTree *cursor_tree = NULL;
   GtkRBNode *cursor_node = NULL;
   GtkTreePath *cursor_path = NULL;
@@ -10126,6 +10128,15 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
                                             mode,
                                            FALSE);
 
+  /* We bail out if the original (tree, node) don't exist anymore after
+   * handling the selection-changed callback.  We do return TRUE because
+   * the key press has been handled at this point.
+   */
+  _gtk_tree_view_find_node (tree_view, cursor_path, &new_tree, &new_node);
+
+  if (cursor_tree != new_tree || cursor_node != new_node)
+    return FALSE;
+
   gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
 
   gtk_widget_grab_focus (GTK_WIDGET (tree_view));
@@ -10143,6 +10154,8 @@ gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view,
 static gboolean
 gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
 {
+  GtkRBTree *new_tree = NULL;
+  GtkRBNode *new_node = NULL;
   GtkRBTree *cursor_tree = NULL;
   GtkRBNode *cursor_node = NULL;
   GtkTreePath *cursor_path = NULL;
@@ -10172,6 +10185,15 @@ gtk_tree_view_real_toggle_cursor_row (GtkTreeView *tree_view)
                                             GTK_TREE_SELECT_MODE_TOGGLE,
                                            FALSE);
 
+  /* We bail out if the original (tree, node) don't exist anymore after
+   * handling the selection-changed callback.  We do return TRUE because
+   * the key press has been handled at this point.
+   */
+  _gtk_tree_view_find_node (tree_view, cursor_path, &new_tree, &new_node);
+
+  if (cursor_tree != new_tree || cursor_node != new_node)
+    return FALSE;
+
   gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
 
   gtk_widget_grab_focus (GTK_WIDGET (tree_view));